package appiumN1tests;

import io.appium.java_client.AppiumDriver;

import java.io.File;
import java.net.URL;
import java.util.concurrent.TimeUnit;

import org.apache.commons.io.FileUtils;
import org.junit.Before;
import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.remote.DesiredCapabilities;



public class testN1 {

	public static AppiumDriver driver;
	
	@Before
	public void SetUp() throws Exception {
		File ClasspathRoot = new File(System.getProperty("user.dir")); //ovaj deo dodas ako zelis da se app deinstalira/instalira
		File appDir = new File(ClasspathRoot, "/app"); // prilikom svakog pokretanja testa
		File app = new File(appDir, "N1.apk");
		
		DesiredCapabilities capabilities = new DesiredCapabilities();
		capabilities.setCapability("browserName", "");
		capabilities.setCapability("deviceName","emulator-5554");
		
		capabilities.setCapability("PlatformVersion", "4.4.2");
		capabilities.setCapability("platformName", "Android");
		capabilities.setCapability("app", app.getAbsolutePath()); // ako nisu aktivne prve 3 linije koda, ne sme biti ni ova, zbog "app"
		capabilities.setCapability("appPackage", "com.n1info" );
		capabilities.setCapability("appActivity", ".RegionsActivity");
		capabilities.setCapability("appWaitActivity", ".RegionsActivity");
		driver = new AppiumDriver(new URL("http://127.0.0.1:4723/wd/hub"), capabilities);
		driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS);
	}
	
	// Test prikaza "velike" vesti tj. prve vesti u listi kada se pokrene aplikacija.
	@Test
	public void testBigNewsOpen() throws Exception {
		
		// za slucaj da nije instaliran Googlay Play Service neophodna je i ova prva linija koda, da bi app kliknuo na pop-up 
		//koji tada iskoci.
		//driver.findElement(By.id("android:id/button1")).click();
		
		driver.findElement(By.id("com.n1info:id/region_rs")).click(); // izbor izdanja za Srbiju
		//driver.findElement(By.id("com.n1info:id/region_hr")).click(); // izbor izdanja za Hrvatsku
		//driver.findElement(By.id("com.n1info:id/region_ba")).click(); // izbor izdanja za BiH
		
		driver.findElement(By.id("com.n1info:id/news_item_big_image")).click();
		Thread.sleep(3000); // timeout, jer se desava da se uradi screenshot pre nego sto se ucitaju svi elementi strane.
		File screenshot = driver.getScreenshotAs(OutputType.FILE);
		FileUtils.copyFile(screenshot, new File(
				 "c:\\Android\\Screenshots\\Big_news_open.png"));
		driver.findElement(By.id("android:id/home")).click();
		driver.findElement(By.id("android:id/up")).click();
		driver.findElementByName("Izdvojeno").click();
		driver.quit(); // mora da se nalazi na kraju svakog testa, kako bi svaki test ponovo pokrenuo app, 
					   // inace nece moci da pokrene sledeci test zbog nemogucnosti da pokrene sesiju, jer je sesija vec pokrenuta.
		
	}

	// Test snimanja clanka - otvaranje prvih vesti u listi vise kategorija, snimanje i provera da li se nalaze u
	// kategoriji "Moji clanci". Sve kategorije osim Sport Kluba.
	@Test
	public void testSavedArticle() throws Exception {
		
		driver.findElement(By.id("com.n1info:id/region_rs")).click(); // izbor izdanja za Srbiju
		//driver.findElement(By.id("com.n1info:id/region_hr")).click(); // izbor izdanja za Hrvatsku
		//driver.findElement(By.id("com.n1info:id/region_ba")).click(); // izbor izdanja za BiH
		
		String[] category = {"Izdvojeno", "Novo", "Popularno", "Video", "Foto", "Vesti", "Biznis", "Svet", "Showbiz", "Lifestyle", "Sci-Tech", "Kolumne"};
		int length = category.length;
		
		for (int i=0; i<length; i++){
			driver.findElement(By.id("android:id/up")).click();
			driver.findElementByName(category[i]).click();
			driver.findElement(By.id("com.n1info:id/news_item_big_image")).click();
			driver.findElement(By.id("com.n1info:id/menu_story_add_to_archive")).click();
			driver.findElement(By.id("android:id/home")).click();
		}
		
		driver.findElement(By.id("android:id/up")).click();
		driver.findElementByName("Moji članci").click();
		Thread.sleep(3000); // timeout, jer se desava da se uradi screenshot pre nego sto se ucitaju svvi elementi strane.
		File screenshot = driver.getScreenshotAs(OutputType.FILE);
		FileUtils.copyFile(screenshot, new File(
				 "c:\\Android\\Screenshots\\Moji_clanci.png"));
		
		driver.quit();
			
	}
	

	// Test snimanja clanka - otvaranje prvih vesti u listi kategorije Sport Klub, snimanje i provera da li se nalaze u
	// kategoriji "Moji clanci".
	@Test
	public void testSavedArticleSportKlub() throws Exception {
		
		driver.findElement(By.id("com.n1info:id/region_rs")).click(); // izbor izdanja za Srbiju
		//driver.findElement(By.id("com.n1info:id/region_hr")).click(); // izbor izdanja za Hrvatsku
		//driver.findElement(By.id("com.n1info:id/region_ba")).click(); // izbor izdanja za BiH
		
		driver.findElement(By.id("android:id/up")).click();
		driver.findElementByName("Sport Klub").click();
		
		String[] subCategory = {"Fudbal", "Košarka", "Tenis", "Formula 1", "Moto GP", "Ostali sportovi"};
		int length = subCategory.length;
		
		for(int i=0; i<length; i++) {
			driver.findElement(By.id("android:id/up")).click();
			driver.findElementByName(subCategory[i]).click();
			driver.findElement(By.id("com.n1info:id/news_item_big_image")).click();
			driver.findElement(By.id("com.n1info:id/menu_story_add_to_archive")).click();
			driver.findElement(By.id("android:id/home")).click();
		}
		
		driver.findElement(By.id("android:id/up")).click();
		driver.findElementByName("Moji članci").click();
		Thread.sleep(3000); // timeout, jer se desava da se uradi screenshot pre nego sto se ucitaju svvi elementi strane.
		File screenshot = driver.getScreenshotAs(OutputType.FILE);
		FileUtils.copyFile(screenshot, new File(
				 "c:\\Android\\Screenshots\\Moji_clanci_Sport_Klub.png"));
		
		driver.quit();
		
	}
	
	// Test vremenske prognoze - otvaranje prognoze za trenutno lokaciju kao i za glavne gradove u regionima koje podrzava
	// aplikacija.
	@Test
	public void testWeatherForecast() throws Exception {
		
		driver.findElement(By.id("com.n1info:id/region_rs")).click(); // izbor izdanja za Srbiju
		//driver.findElement(By.id("com.n1info:id/region_hr")).click(); // izbor izdanja za Hrvatsku
		//driver.findElement(By.id("com.n1info:id/region_ba")).click(); // izbor izdanja za BiH
		
		
		// test sa trenutnom lokacijom
		driver.findElement(By.id("com.n1info:id/weather_menu_city")).click();
		driver.findElement(By.id("com.n1info:id/dialog_button_use_location")).click();
		Thread.sleep(3000);
		File screenshot_1 = driver.getScreenshotAs(OutputType.FILE);
		FileUtils.copyFile(screenshot_1, new File(
				 "c:\\Android\\Screenshots\\Vremenska_trenutna_lokacija.png"));
		
		
		// test sa odabirom nekoliko gradova
	
		String[] city = {"Beograd", "Novi Sad", "Zagreb", "Rijeka", "Sarajevo", "Banja Luka", "Rim", "Stokholm", "Berlin", "New York"};
		int length = city.length;
		
		
		for (int i=0; i<length; i++) {
			driver.findElement(By.id("com.n1info:id/weather_menu_city")).click();
			driver.findElement(By.id("com.n1info:id/dialog_button_search_location")).click();
			driver.findElement(By.id("com.n1info:id/weather_search_field")).sendKeys(city[i]);
			driver.findElement(By.id("com.n1info:id/weather_search_city")).click();
			Thread.sleep(3000);
			File screenshot_2 = driver.getScreenshotAs(OutputType.FILE);
			FileUtils.copyFile(screenshot_2, new File(
					 "c:\\Android\\Screenshots\\Vremenska_" + city[i] + ".png"));
		}
		
		driver.quit();
	
	}

	// Test prikaza i otvaranja banera.
	@Test
	public void testBanner() throws Exception {
			
		driver.findElement(By.id("com.n1info:id/region_rs")).click(); // izbor izdanja za Srbiju
		//driver.findElement(By.id("com.n1info:id/region_hr")).click(); // izbor izdanja za Hrvatsku
		//driver.findElement(By.id("com.n1info:id/region_ba")).click(); // izbor izdanja za BiH
		
		// Ovde definisati niz stringova sa imenima kategorija i resiti test u jednoj for petlji!!!
		String[] category = {"Novo", "Popularno", "Video", "Foto", "Vesti", "Biznis", "Svet", "Showbiz", "Lifestyle", "Sci-Tech", "Kolumne"};
		int length = category.length;
		
		
		for (int i=0; i<length; i++) {
			driver.findElement(By.id("android:id/up")).click();
			driver.findElementByName(category[i]).click();
			driver.swipe(400, 600, 400, 100, 1000); // radi scroll down
			driver.findElementById("com.n1info:id/news_item_banner").click();
			Thread.sleep(3000);
			File screenshot = driver.getScreenshotAs(OutputType.FILE);
			FileUtils.copyFile(screenshot, new File(
					 "c:\\Android\\Screenshots\\Banner_Click_Link_" + category[i] + ".png"));
			driver.navigate().back(); // klik na hardversko Back dugme
		}
		
		
		driver.quit();
		
		}
	
	
	// Test prikaza N1 Uzivo
	@Test
	public void testN1Live() throws Exception {
		
		driver.findElement(By.id("com.n1info:id/region_rs")).click(); // izbor izdanja za Srbiju
		//driver.findElement(By.id("com.n1info:id/region_hr")).click(); // izbor izdanja za Hrvatsku
		//driver.findElement(By.id("com.n1info:id/region_ba")).click(); // izbor izdanja za BiH
		
		driver.findElement(By.id("android:id/up")).click();
		driver.findElementByName("N1 Uživo").click();
		Thread.sleep(20000);
		File screenshot = driver.getScreenshotAs(OutputType.FILE);
		FileUtils.copyFile(screenshot, new File(
				 "c:\\Android\\Screenshots\\N1Live.png"));
		
		driver.quit();
		
	}
	
	
	// Test izbora edicije Srbija na pocetnom ekranu
	@Test
	public void testEditionSerbia() throws Exception {
		
		driver.findElement(By.id("com.n1info:id/region_rs")).click(); // izbor izdanja za Srbiju
		driver.findElement(By.id("android:id/up")).click();
		Thread.sleep(3000);
		File screenshot = driver.getScreenshotAs(OutputType.FILE);
		FileUtils.copyFile(screenshot, new File(
				 "c:\\Android\\Screenshots\\Edition_Serbia.png"));
		
		driver.quit();
		
	}
	
	
	// Test izbora edicije Hrvatsku na pocetnom ekranu
		@Test
		public void testEditionCroatia() throws Exception {
			
			driver.findElement(By.id("com.n1info:id/region_hr")).click(); // izbor izdanja za Hrvatsku
			driver.findElement(By.id("android:id/up")).click();
			Thread.sleep(3000);
			File screenshot = driver.getScreenshotAs(OutputType.FILE);
			FileUtils.copyFile(screenshot, new File(
					 "c:\\Android\\Screenshots\\Edition_Croatia.png"));
			
			driver.quit();
		
		}
		
		
		// Test izbora edicije BiH na pocetnom ekranu
		@Test
		public void testEditionBiH() throws Exception {
			
			driver.findElement(By.id("com.n1info:id/region_ba")).click(); // izbor izdanja za BiH
			driver.findElement(By.id("android:id/up")).click();
			Thread.sleep(3000);
			File screenshot = driver.getScreenshotAs(OutputType.FILE);
			FileUtils.copyFile(screenshot, new File(
					 "c:\\Android\\Screenshots\\Edition_BiH.png"));
			
			driver.quit();
		
		}
		
		
		// Test promene edicije
		@Test
		public void testEditionSelect() throws Exception {
			
			driver.findElement(By.id("com.n1info:id/region_rs")).click(); // izbor izdanja za Srbiju na pocetnom ekranu izbora edicija
			
			String[] edition = {"BIH", "HRVATSKA", "SRBIJA"};
			int length = edition.length;
			
			driver.findElement(By.id("android:id/up")).click();
			
			for(int i=0; i<length; i++){
				driver.findElement(By.id("com.n1info:id/spinner_item_title")).click();
				driver.findElementByName(edition[i]).click();
				
				driver.findElement(By.id("com.n1info:id/dialog_button")).click();
				driver.findElement(By.id("android:id/up")).click();
				Thread.sleep(3000);
				File screenshot = driver.getScreenshotAs(OutputType.FILE);
				FileUtils.copyFile(screenshot, new File(
						 "c:\\Android\\Screenshots\\Edition_Changed_To_" + edition[i] + ".png"));
			}
			
			driver.quit();
				
		}
	
}
